package csvm_v1.coins;

/**
 * Coin adalah kelas abstrak bagi koin input vending machine. Coin memiliki
 * atribut dimensi koin (ketebalan, ukuran, dan berat) dan nilai dari koin.
 *
 * @author Muqtafi Akhmad
 */
public abstract class Coin {

    /**
     * mengisikan ukuran koin
     *
     * @param size ukuran koin
     */
    public void setSize(float size) {
        this.size = size;
    }

    /**
     * mengisikan berat koin
     *
     * @param weight berat koin
     */
    public void setWeight(float weight) {
        this.weight = weight;
    }

    /**
     * mengisikan ketebalan koin
     *
     * @param thickness ketebalan koin
     */
    public void setThickness(float thickness) {
        this.thickness = thickness;
    }

    /**
     * mengisikan keterangan apakah koin bergerigi
     *
     * @param isSerratedEdge keterangan gerigi
     */
    public void setIsSerratedEdge(boolean isSerratedEdge) {
        this.isSerratedEdge = isSerratedEdge;
    }

    /**
     * mengisikan nilai dari koin
     *
     * @param value nilai koin
     */
    public void setValue(int value) {
        this.value = value;
    }

    /**
     * mendapatkan ukuran dari koin
     *
     * @return ukuran koin
     */
    public float getSize() {
        return size;
    }

    /**
     * mendapatkan berat dari koin
     *
     * @return berat koin
     */
    public float getWeight() {
        return weight;
    }

    /**
     * mendapatkan ketebalan dari koin
     *
     * @return ketebalan koin
     */
    public float getThickness() {
        return thickness;
    }

    /**
     * mendapatkan keterangan apakah koin bergerigi
     *
     * @return keterangan bergerigi
     */
    public boolean isIsSerratedEdge() {
        return isSerratedEdge;
    }

    /**
     * mendapatkan nilai dari koin
     *
     * @return nilai koin
     */
    public int getValue() {
        return value;
    }
    /**
     * ukuran koin
     */
    private float size;
    /**
     * berat koin
     */
    private float weight;
    /**
     * ketebalan koin
     */
    private float thickness;
    /**
     * keterangan apakah koin bergerigi
     */
    private boolean isSerratedEdge;
    /**
     * nilai koin
     */
    private int value;
    /**
     * nilai toleransi bagi dimensi koin input
     */
    protected static final float dimensionTolerance = (float) 0.05;

    /**
     * konstruktor dari Coin
     *
     * @param size ukuran
     * @param weight berat
     * @param thickness ketebalan
     * @param isSerratedEdge keterangan bergerigi
     * @param value nilai
     */
    public Coin(float size, float weight, float thickness, boolean isSerratedEdge, int value) {
        this.size = size;
        this.weight = weight;
        this.thickness = thickness;
        this.isSerratedEdge = isSerratedEdge;
        this.value = value;
    }

    /**
     * mengembalikan nama dari koin
     *
     * @return nama koin
     */
    public abstract String getCoinName();
}
